package controller;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;

import model.Endereco;
import model.Status;
import model.Usuario;
import dao.UsuarioDAO;

public class UsuarioController {

	private UsuarioDAO usuarioDAO;

	public boolean inserirUsuario(String cpf, String nome, String email, String senha, 
			String profissao, String dataNascimento, Status status,
			String nomeDependente, String emailDependente, String logradouro, String numero, 
			String cidade, String cep) throws Exception {
		
		Endereco endereco = new Endereco(logradouro, numero, cidade, cep);
		Usuario usuario = new Usuario(0, cpf, nome, email, senha, profissao, dataNascimento, endereco, 
				status, nomeDependente, emailDependente);
		return getUsuarioDAO().inserir(usuario);
	}

	public boolean alterarUsuario(int id, String cpf, String nome, String email, String senha, 
			String profissao, String dataNascimento, Status status,
			String nomeDependente, String emailDependente, String logradouro, String numero, 
			String cidade, String cep) throws Exception {
		
		Usuario usuario = buscarUsuarioPorId(id);
		
		usuario.setCpf(cpf);
		usuario.setNome(nome);
		usuario.setEmail(email);
		usuario.setSenha(senha);
		usuario.setProfissao(profissao);
		usuario.setDataNascimento(dataNascimento);
		usuario.setNomeDependente(nomeDependente);
		usuario.setEmailDependente(emailDependente);
		//Endere�o
		usuario.getEndereco().setLogradouro(logradouro);
		usuario.getEndereco().setNumero(numero);
		usuario.getEndereco().setCidade(cidade);
		usuario.getEndereco().setCep(cep);
		
		if (!usuario.getStatus().equals(status)){
			usuario.setStatus(status);
			if (status == Status.LIVRE){
				usuario.setDataStatus(null);
			} else {
				usuario.setDataStatus(new Date());	
			}
		}
		return getUsuarioDAO().alterar(usuario);
	}

	public boolean excluirUsuario(int id) throws Exception {
		Usuario usuario = buscarUsuarioPorId(id);
		return getUsuarioDAO().delete(usuario);
	}

	public void verificaDesbloqueioDeUsuarios() throws Exception {
		Collection<Usuario> usuariosBloqueados = new ArrayList<Usuario>();
		try {
			usuariosBloqueados = getUsuarioDAO().buscarUsuarioBloqueadoPorNome("");
		} catch (SQLException e) {
			e.printStackTrace();
		}

		if (usuariosBloqueados != null && !usuariosBloqueados.isEmpty()) {
			Date dataAtual = new Date();
			for (Usuario usuario : usuariosBloqueados) {
				Calendar calendar = Calendar.getInstance();
				calendar.setTime(usuario.getDataStatus());

				if (usuario.getStatus().equals(Status.ADVERTENCIA)) {
					calendar.add(Calendar.DATE, 30);
				} else if (usuario.getStatus().equals(Status.SUSPENSAO)) {
					calendar.add(Calendar.DATE, 90);
				}

				if (calendar.getTime().compareTo(dataAtual) <= 0) {
					usuario.setStatus(Status.LIVRE);
					usuario.setDataStatus(null);
					getUsuarioDAO().alterar(usuario);
				}
			}
		} else {
			return;
		}
	}

	public Collection<Usuario> buscarUsuariosPorNome(String nome) throws Exception {
		return getUsuarioDAO().buscarUsuariosPorNome(nome);
	}

	public Usuario buscarUsuarioPorId(int id) throws Exception {
		return getUsuarioDAO().buscarUsuarioPorId(id);
	}

	public Usuario buscarUsuarioPorEmail(String email) throws Exception {
		return getUsuarioDAO().buscarUsuarioPorEmail(email);
	}

	public Collection<Usuario> buscarUsuarioBloqueadoPorNome(String nome) throws Exception {
		return getUsuarioDAO().buscarUsuarioBloqueadoPorNome(nome);
	}

	public Usuario verificaUsuarioSenha(String email, String senha) throws Exception {
		return getUsuarioDAO().verificaUsuarioSenha(email, senha);
	}

	public boolean verificaSeUsuarioPodeAcessar(String email) throws Exception {
		return getUsuarioDAO().verificaSeUsuarioPodeAcessar(email);
	}

	public UsuarioDAO getUsuarioDAO() {
		if (usuarioDAO == null) {
			usuarioDAO = new UsuarioDAO();
		}
		return usuarioDAO;
	}
	public Collection<Usuario> buscarUsuariosBloqueados() throws SQLException, Exception {
		return getUsuarioDAO().buscarUsuariosBloqueados();
	}
}